/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Logistica.Controlador;


import com.dp1.pucp.Modelo.Clases.*;
import com.dp1.pucp.Logistica.DAO.*;
import com.dp1.pucp.Logistica.Vista.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JTable;
import javax.swing.table.TableModel;

/**
 *
 * @author ubuntu64
 */
public class DetalleMateriaPrimaNecesariaControlador {
    private TipoProductoDAO m;
    private DetalleMateriaPrimaNecesariaGUI detalleMateriaPrimaView;
    private Almacen alm;
    private ArrayList<String> lstTipo;
    private TableModel table;
    private ArrayList<Pedidoproducto> pedidoProducto;
    private ArrayList<Lineapedidoproducto> lineaPedidoProducto;
    private AceptarPedidoProductoControlador aceptarPedidoProductoControlador;
    private final static int ESTADO_ACTIVO=1;

    public DetalleMateriaPrimaNecesariaControlador(TipoProductoDAO dao, DetalleMateriaPrimaNecesariaGUI view, AceptarPedidoProductoControlador buc, ArrayList<Pedidoproducto> u,ArrayList<Lineapedidoproducto> v){
        m = dao;
        detalleMateriaPrimaView = view;
        aceptarPedidoProductoControlador = buc;
        
        pedidoProducto=u;
        lineaPedidoProducto=v;
        table= detalleMateriaPrimaView.getTable();
        llenarGrilla(lineaPedidoProducto);

        //detalleMateriaPrimaView.setFormUsuario(alm);
        
        detalleMateriaPrimaView.addProcesarListener(new procesarListener(this));
        detalleMateriaPrimaView.addCancelarListener(new cancelarListener());              
        //detalleMateriaPrimaView.addGuardarListener(new guardarTipoProductoListener());
        
    }
    
    class cancelarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            detalleMateriaPrimaView.dispose();
        }        
    }
    
    private void llenarGrilla( ArrayList<Lineapedidoproducto> linea){
        //int fil=table.getRowCount();
        //int col=table.getColumnCount();
        detalleMateriaPrimaView.llenaGrilla(linea);

    }
        
    class procesarListener implements ActionListener {
        
        private DetalleMateriaPrimaNecesariaControlador buc;
        public procesarListener(DetalleMateriaPrimaNecesariaControlador buscarusr){
            buc=buscarusr;
        }
                
        @Override
        public void actionPerformed(ActionEvent e) {
            int fil=table.getRowCount();
            //int col=table.getColumnCount();
            int k,i,j;
            ArrayList<RecetaPfMp> Nuevareceta=new ArrayList<RecetaPfMp>();
            ArrayList<RecetaPfMp> recetaUltim=new ArrayList<RecetaPfMp>(); 
            //este es la lista que tiene los PF necesarios!!!!
            for(i=0;i<fil;i++){
                Lineapedidoproducto linea=lineaPedidoProducto.get(i);
                //aca trabajo la linea
                float cant=linea.getCantidad();
                
                int codProd=linea.getTipoproducto().getIdtipoproducto();
                int codPres=linea.getPresentacion().getIdpresentacion();
                //saco cantidad que contiene una presentacion
                ArrayList<Presentacion> pres=m.listarPresent(codPres);
                int cantPres=pres.get(0).getCantidad();// 0 es el unnico que existe 
                float totalGalletas=cantPres*cant;
                
                //Busco codigo producto en la tabla receta saco listado
                ArrayList<RecetaPfMp> lstreceta=m.listarReceta(codProd);
                //Por cada i, galleta hallo la cantidad necesaria y lo pongo en un arreglo nuevo
               
                for(j=0;j<lstreceta.size();j++){
                        int encontrado=0;
                        int codMP=lstreceta.get(j).getTipoproductoByIdtipoproductoMp().getIdtipoproducto();
                         //agrego todo la 1ra receta del 1er producto o sea i=0
                        //if(i==0){
                          //  float cantidad=lstreceta.get(j).getCantidad();
                            //lstreceta.get(j).setCantidad(totalGalletas*cantidad);
                            
                            //Nuevareceta.add(lstreceta.get(j));
                        //}
                        
                        //creo que hay un for con k !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    for(k=0;k<Nuevareceta.size();k++){

                        if(Nuevareceta.size()>0){
                        //en otro caso comparo
                            if(Nuevareceta.get(k).getTipoproductoByIdtipoproductoMp().getIdtipoproducto()==codMP){
                                encontrado=1;
                                break;
                            }
                        }
                    }
                    
                    if(encontrado==1){//si lo encuentro es decir es repetido
                        float cant1=Nuevareceta.get(k).getCantidad();
                        float cant2=lstreceta.get(j).getCantidad();
                        //se actualizo la cantidad cuando las idMP son los mismos
                        Nuevareceta.get(k).setCantidad(cant1+cant2*totalGalletas);
                    }
                    else{//encontrado==0
                        float cantidad=lstreceta.get(j).getCantidad();
                        //Ya lo agrego con la cantidad pura, neta
                        lstreceta.get(j).setCantidad(totalGalletas*cantidad);
                        Nuevareceta.add(lstreceta.get(j));
                        //creo k va break
                        //break;
                    }

                }
                
             }    
            //ArrayList<Lineapedidoproducto> difLineaPedido=new ArrayList<>();
            //int sel=aceptarPedidoProductoView.getFilaSel();
            
            //Saco todo lo que hay en mi almacen y corroboro con lo que necesito
             ArrayList<Materiaprima> almacenMateriaPrima=m.listarAlmacenMP();    
             
             
             int l,o;
             for(l=0;l<Nuevareceta.size();l++){
                 
                 //float canti=almacenMateriaPrima.get(l).get
                  int encontrado=0;
                 
                 for(o=0;o<almacenMateriaPrima.size();o++){
                     int codMatP=almacenMateriaPrima.get(o).getTipoproducto().getIdtipoproducto();
                     
                     if((Nuevareceta.get(l).getTipoproductoByIdtipoproductoMp().getIdtipoproducto()==codMatP))
                                   {
                                   encontrado=1;
                                   break;
                                   //int variableY=y;
                                   //break;//una vez que lo encuentre esa pres y tipo le hago break  
                     }
                 }
                 if(encontrado==1){
                        float cantMP=almacenMateriaPrima.get(o).getCantidad();//el x salio con un valor
                        
                        float cantDif=Nuevareceta.get(l).getCantidad()-cantMP;
                        if(cantDif>0){
                            //estoy guardando solo las lineas de recetas en la cual lo necesario sea mayor a lo que tengo
                            //en almacen
                             Nuevareceta.get(l).setCantidad(cantDif);
                             recetaUltim.add(Nuevareceta.get(l));
                        }
                  }
                  if(encontrado==0){
                       //si no lo encuentro lo agrego directamente porque necesito esa linea 
                            recetaUltim.add(Nuevareceta.get(l));
                  }  
             } 
             
            
            if(recetaUltim.size()!=1){
                GenerarPedidoCompraGUI p = new GenerarPedidoCompraGUI(detalleMateriaPrimaView.getPadre(), true);
                GenerarPedidoCompraControlador c = new GenerarPedidoCompraControlador (m,p,buc,recetaUltim);
                
                p.setVisible(true);
                }
                //si es vacio, es porque lo que tengo es mayor a lo que se necesita
            else{
                    //aca mando a producir directamente, debido a que tengo suficiente mateira prima para poder
                //producir eso, ahora tengo que disminuir eso en almacen
                    TableModel table=detalleMateriaPrimaView.getTable();
//                  //saco las filas que tiene esa tabla
                    int fila=table.getRowCount();
                    
                    for(int p=0;p<fila;p++){
                    //agrego un pedido de frente, esto no tiene linea
                        Pedidoproduccion pedidoProd=new Pedidoproduccion();
                        Date fechaI=new Date();
                        
                        pedidoProd.setEstado(1);
                        pedidoProd.setFecha(fechaI);
                        
                        //ṕara cada uno de esos pedidos produccion, hallo su receta y voy acumulando la receta origninal
                        //necesaria para disminuir este en el almacen
                        //float cant=lineaPedidoProducto.get(p).getCantidad();
                        
                        int codProd=lineaPedidoProducto.get(p).getTipoproducto().getIdtipoproducto();
                        float canti=lineaPedidoProducto.get(p).getCantidad();
                        
                        
                        //saco listado de receta para ese producto
                        for(o=0;o<fila;o++){
                            
                        
                        
                            
                        }
                        pedidoProd.setCantidad(canti);
                        
                        
                        Tipoproducto prod=recetaUltim.get(p).getTipoproductoByIdtipoproductoPf();
                        pedidoProd.setTipoproducto(prod);
                        
                        pedidoProd.setCantidadCubierta(Float.parseFloat(String.valueOf(0)));
                        pedidoProd.setTurno(0);
                        
                        m.guardarPedidoProduccion(pedidoProd);
   
                    }
                    
                    detalleMateriaPrimaView.mostrarAviso("Se guardo exitosamente el pedido produccion");
            }
             
        }
    }
  
    
}
          
